#pragma once
#include "hashtable.h"
#include "MinHeap.h"
#define bool int
#define true 1
#define false 0
//LRU双向链表结构
//按时间顺序指向哈希表中数据
typedef struct LRUNode   
{
    char *key;
    void *value;
    size_t value_size;
    struct LRUNode *prev;
    struct LRUNode *next;
} LRUNode;

//缓存结构
//通过LRU来管理哈希表
typedef struct Cache
{
    int mode;
    HashTable *table;   //存放文件内容
    int max_size;
    int current_size;
    MinHeap* minHeap;
    LRUNode *lru_head;
    LRUNode *lru_tail;
    pthread_mutex_t lru_mutex;
} Cache;

//创建缓存
Cache *create_cache(int max_size);

//释放缓存
void destroy_cache(Cache *cache);

//释放LRU
void Destroy_LRU(Cache *cache);

//缓存中添加数据
void add_to_cache(Cache *cache, char *key, void *value, size_t value_size);

//缓存中查找数据
char *get_from_cache(Cache *cache, char *key);

//缓存中删除最久未用的数据
void remove_lru(Cache *cache, char *key);

//从文件中读取数据
bool read_from_file(Cache *cache, char *key, char **re_value);


//移动到LRU链头
void move_to_head(Cache *cache, LRUNode *node);

//转换为另一种调度模式
void SwitchToOther(Cache *cache);

//添加到LRU
void Add_to_LRU(Cache *cache, char *key, void *value, size_t value_size);
